package com.example.tech34Base64.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

/**
 *  使用spring实现异步需要开启注解，可以使用xml方式或者java config的方式。
 *  @ComponentScan 只在测试的时候放开注解使用
 *  注解多线程生效的限制：
 *  1.两个方法都在同一个类里面，只是一个方法调用另一个异步方法，不生效。解决方法：拆分两个方法，将异步方法单独放在一个类里面，然后再去调用就解决了。
 *  2.有接口方法的实现类里的注解不生效。解决方法：在实现类中调用一个没有接口的类才可以
 */
//@ComponentScan({"com.techstar.ins.core.thread"})
@Configuration
@EnableAsync
public class Config implements AsyncConfigurer {

    private static Logger LOGGER = LoggerFactory.getLogger(Config.class);

    /**
     * 配置方法
     * @return
     */
    @Override
    public Executor getAsyncExecutor() {
        //线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(10);//核心线程数
        taskExecutor.setMaxPoolSize(20);//最大线程数
        taskExecutor.setQueueCapacity(100);//队列大小
        taskExecutor.initialize();//初始化
        return taskExecutor;
    }

}
